// 创建user对象
var User = {
    username: "alex",
    age: 20
}
// 创建代理对象
User = new Proxy(User, {
    //target: 被代理对象， p:属性， receiver 代理后的对象就是 User
    get(target, p, receiver) {
        console.log(`获取属性${p},操作`)
        // 返回代理对象的p属性值
        return Reflect.get(target, p);
    },
    set(target, p, value) {
        console.log(`设置属性${p}操作`)
        Reflect.set(target, p, value);
    },
    getOwnPropertyDescriptor(target, p) {
        let result;
        result = Reflect.getOwnPropertyDescriptor(target, p);
        console.log(`通过属性描述符获取属性${p}操作生效`);
        return result;
    }
});

console.log(User.age)
User.age = 30
console.log(User.age)
console.log(User.address)

console.log(Object.getOwnPropertyDescriptor(User, "name"))

var Person = {}

// 通过属性描述符给 Person 对象定义 一个 name 属性
Object.defineProperty(Person, "name", {
    value: "wusir",
    writable: true,  // 允许修改属性值
    enumerable: true, // 允许枚举属性值
    configurable: true // 允许删除或修改属性
})

// 代理 函数
add = function (a, b) {
    console.log("add 函数正在被调用")
    return a + b;
}
add = new Proxy(add, {
    apply: function (target, thisArg, argList) {
        // target: 函数对象， 调用函数的this 指针， argList:函数的参数数组
        let result;
        result = Reflect.apply(target, thisArg, argList);
        console.log(`${target.name}函数调用，参数为:${argList}`);
        return result;
    }
});

add(1, 2)
